ಆಬ್ಜೆಕ್ಟ್ ಬಿಹೇವಿಯರ್ ಮಾಡಿಫಿಕೇಶನ್ಗಾಗಿ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಪ್ರಾಕ್ಸಿ ಪ್ಯಾಟರ್ನ್ಗಳನ್ನು ಅನ್ವೇಷಿಸಿ. ವ್ಯಾಲಿಡೇಶನ್, ವರ್ಚುವಲೈಸೇಶನ್, ಟ್ರ್ಯಾಕಿಂಗ್ ಮತ್ತು ಕೋಡ್ ಉದಾಹರಣೆಗಳೊಂದಿಗೆ ಇತರ ಸುಧಾರಿತ ತಂತ್ರಗಳನ್ನು ಕಲಿಯಿರಿ.
ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಪ್ರಾಕ್ಸಿ ಪ್ಯಾಟರ್ನ್ಸ್: ಆಬ್ಜೆಕ್ಟ್ ಬಿಹೇವಿಯರ್ ಮಾಡಿಫಿಕೇಶನ್ನಲ್ಲಿ ಪಾಂಡಿತ್ಯ
ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಪ್ರಾಕ್ಸಿ ಆಬ್ಜೆಕ್ಟ್, ಆಬ್ಜೆಕ್ಟ್ಗಳ ಮೇಲಿನ ಮೂಲಭೂತ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ತಡೆಹಿಡಿಯಲು ಮತ್ತು ಕಸ್ಟಮೈಸ್ ಮಾಡಲು ಒಂದು ಶಕ್ತಿಯುತ ವ್ಯವಸ್ಥೆಯನ್ನು ಒದಗಿಸುತ್ತದೆ. ಈ ಸಾಮರ್ಥ್ಯವು ಆಬ್ಜೆಕ್ಟ್ ಬಿಹೇವಿಯರ್ ಅನ್ನು ನಿಯಂತ್ರಿಸಲು ವ್ಯಾಪಕ ಶ್ರೇಣಿಯ ಡಿಸೈನ್ ಪ್ಯಾಟರ್ನ್ಗಳು ಮತ್ತು ಸುಧಾರಿತ ತಂತ್ರಗಳಿಗೆ ದಾರಿ ಮಾಡಿಕೊಡುತ್ತದೆ. ಈ ಸಮಗ್ರ ಮಾರ್ಗದರ್ಶಿ ವಿವಿಧ ಪ್ರಾಕ್ಸಿ ಪ್ಯಾಟರ್ನ್ಗಳನ್ನು ಅನ್ವೇಷಿಸುತ್ತದೆ, ಪ್ರಾಯೋಗಿಕ ಕೋಡ್ ಉದಾಹರಣೆಗಳೊಂದಿಗೆ ಅವುಗಳ ಉಪಯೋಗಗಳನ್ನು ವಿವರಿಸುತ್ತದೆ.
ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಪ್ರಾಕ್ಸಿ ಎಂದರೇನು?
ಒಂದು ಪ್ರಾಕ್ಸಿ ಆಬ್ಜೆಕ್ಟ್ ಇನ್ನೊಂದು ಆಬ್ಜೆಕ್ಟ್ (ಟಾರ್ಗೆಟ್) ಅನ್ನು ಸುತ್ತುವರೆದು ಅದರ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ತಡೆಹಿಡಿಯುತ್ತದೆ. ಈ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು 'ಟ್ರಾಪ್ಸ್' ಎಂದು ಕರೆಯಲಾಗುತ್ತದೆ, ಇದರಲ್ಲಿ ಪ್ರಾಪರ್ಟಿ ಲುಕಪ್, ಅಸೈನ್ಮೆಂಟ್, ಎನ್ಯುಮರೇಶನ್, ಮತ್ತು ಫಂಕ್ಷನ್ ಇನ್ವೋಕೇಶನ್ ಸೇರಿವೆ. ಈ ಕಾರ್ಯಾಚರಣೆಗಳ ಮೊದಲು, ನಂತರ, ಅಥವಾ ಬದಲಿಗೆ ಕಾರ್ಯಗತಗೊಳಿಸಲು ಕಸ್ಟಮ್ ಲಾಜಿಕ್ ಅನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಲು ಪ್ರಾಕ್ಸಿ ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಪ್ರಾಕ್ಸಿಯ ಮೂಲಭೂತ ಪರಿಕಲ್ಪನೆಯು "ಮೆಟಾಪ್ರೋಗ್ರಾಮಿಂಗ್" ಅನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ, ಇದು ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಭಾಷೆಯ ನಡವಳಿಕೆಯನ್ನೇ ಮಾರ್ಪಡಿಸಲು ನಿಮಗೆ ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ.
ಪ್ರಾಕ್ಸಿ ರಚಿಸುವ ಮೂಲ ಸಿಂಟ್ಯಾಕ್ಸ್ ಹೀಗಿದೆ:
const proxy = new Proxy(target, handler);
- ಟಾರ್ಗೆಟ್: ನೀವು ಪ್ರಾಕ್ಸಿ ಮಾಡಲು ಬಯಸುವ ಮೂಲ ಆಬ್ಜೆಕ್ಟ್.
- ಹ್ಯಾಂಡ್ಲರ್: ಟಾರ್ಗೆಟ್ ಮೇಲಿನ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ಪ್ರಾಕ್ಸಿ ಹೇಗೆ ತಡೆಹಿಡಿಯುತ್ತದೆ ಎಂಬುದನ್ನು ವ್ಯಾಖ್ಯಾನಿಸುವ ಮೆಥಡ್ಗಳನ್ನು (ಟ್ರಾಪ್ಸ್) ಒಳಗೊಂಡಿರುವ ಆಬ್ಜೆಕ್ಟ್.
ಸಾಮಾನ್ಯ ಪ್ರಾಕ್ಸಿ ಟ್ರಾಪ್ಸ್
ಹ್ಯಾಂಡ್ಲರ್ ಆಬ್ಜೆಕ್ಟ್ ಹಲವಾರು ಟ್ರಾಪ್ಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಬಹುದು. ಇಲ್ಲಿ ಸಾಮಾನ್ಯವಾಗಿ ಬಳಸಲಾಗುವ ಕೆಲವು ಟ್ರಾಪ್ಗಳಿವೆ:
- get(target, property, receiver): ಪ್ರಾಪರ್ಟಿ ಆಕ್ಸೆಸ್ ಅನ್ನು ತಡೆಹಿಡಿಯುತ್ತದೆ (ಉದಾ.,
obj.property
). - set(target, property, value, receiver): ಪ್ರಾಪರ್ಟಿ ಅಸೈನ್ಮೆಂಟ್ ಅನ್ನು ತಡೆಹಿಡಿಯುತ್ತದೆ (ಉದಾ.,
obj.property = value
). - has(target, property):
in
ಆಪರೇಟರ್ ಅನ್ನು ತಡೆಹಿಡಿಯುತ್ತದೆ (ಉದಾ.,'property' in obj
). - deleteProperty(target, property):
delete
ಆಪರೇಟರ್ ಅನ್ನು ತಡೆಹಿಡಿಯುತ್ತದೆ (ಉದಾ.,delete obj.property
). - apply(target, thisArg, argumentsList): ಫಂಕ್ಷನ್ ಕಾಲ್ಗಳನ್ನು ತಡೆಹಿಡಿಯುತ್ತದೆ (ಟಾರ್ಗೆಟ್ ಫಂಕ್ಷನ್ ಆಗಿದ್ದಾಗ).
- construct(target, argumentsList, newTarget):
new
ಆಪರೇಟರ್ ಅನ್ನು ತಡೆಹಿಡಿಯುತ್ತದೆ (ಟಾರ್ಗೆಟ್ ಕನ್ಸ್ಟ್ರಕ್ಟರ್ ಫಂಕ್ಷನ್ ಆಗಿದ್ದಾಗ). - getPrototypeOf(target):
Object.getPrototypeOf()
ಗೆ ಮಾಡುವ ಕಾಲ್ಗಳನ್ನು ತಡೆಹಿಡಿಯುತ್ತದೆ. - setPrototypeOf(target, prototype):
Object.setPrototypeOf()
ಗೆ ಮಾಡುವ ಕಾಲ್ಗಳನ್ನು ತಡೆಹಿಡಿಯುತ್ತದೆ. - isExtensible(target):
Object.isExtensible()
ಗೆ ಮಾಡುವ ಕಾಲ್ಗಳನ್ನು ತಡೆಹಿಡಿಯುತ್ತದೆ. - preventExtensions(target):
Object.preventExtensions()
ಗೆ ಮಾಡುವ ಕಾಲ್ಗಳನ್ನು ತಡೆಹಿಡಿಯುತ್ತದೆ. - getOwnPropertyDescriptor(target, property):
Object.getOwnPropertyDescriptor()
ಗೆ ಮಾಡುವ ಕಾಲ್ಗಳನ್ನು ತಡೆಹಿಡಿಯುತ್ತದೆ. - defineProperty(target, property, descriptor):
Object.defineProperty()
ಗೆ ಮಾಡುವ ಕಾಲ್ಗಳನ್ನು ತಡೆಹಿಡಿಯುತ್ತದೆ. - ownKeys(target):
Object.getOwnPropertyNames()
ಮತ್ತುObject.getOwnPropertySymbols()
ಗೆ ಮಾಡುವ ಕಾಲ್ಗಳನ್ನು ತಡೆಹಿಡಿಯುತ್ತದೆ.
ಪ್ರಾಕ್ಸಿ ಪ್ಯಾಟರ್ನ್ಸ್ ಮತ್ತು ಉಪಯೋಗಗಳು
ಕೆಲವು ಸಾಮಾನ್ಯ ಪ್ರಾಕ್ಸಿ ಪ್ಯಾಟರ್ನ್ಗಳನ್ನು ಮತ್ತು ಅವುಗಳನ್ನು ನೈಜ-ಪ್ರಪಂಚದ ಸನ್ನಿವೇಶಗಳಲ್ಲಿ ಹೇಗೆ ಅನ್ವಯಿಸಬಹುದು ಎಂಬುದನ್ನು ಅನ್ವೇಷಿಸೋಣ:
1. ವ್ಯಾಲಿಡೇಶನ್
ವ್ಯಾಲಿಡೇಶನ್ ಪ್ಯಾಟರ್ನ್, ಪ್ರಾಪರ್ಟಿ ಅಸೈನ್ಮೆಂಟ್ಗಳ ಮೇಲೆ ನಿರ್ಬಂಧಗಳನ್ನು ಹೇರಲು ಪ್ರಾಕ್ಸಿಯನ್ನು ಬಳಸುತ್ತದೆ. ಡೇಟಾ ಸಮಗ್ರತೆಯನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಇದು ಉಪಯುಕ್ತವಾಗಿದೆ.
const validator = {
set: function(obj, prop, value) {
if (prop === 'age') {
if (!Number.isInteger(value)) {
throw new TypeError('ವಯಸ್ಸು ಪೂರ್ಣಾಂಕವಲ್ಲ');
}
if (value < 0) {
throw new RangeError('ವಯಸ್ಸು ಋಣಾತ್ಮಕವಲ್ಲದ ಪೂರ್ಣಾಂಕವಾಗಿರಬೇಕು');
}
}
// ಮೌಲ್ಯವನ್ನು ಸಂಗ್ರಹಿಸಲು ಡೀಫಾಲ್ಟ್ ನಡವಳಿಕೆ
obj[prop] = value;
// ಯಶಸ್ಸನ್ನು ಸೂಚಿಸಿ
return true;
}
};
let person = {};
let proxy = new Proxy(person, validator);
proxy.age = 25; // ಮಾನ್ಯ
console.log(proxy.age); // ಔಟ್ಪುಟ್: 25
try {
proxy.age = 'young'; // TypeError ಅನ್ನು ಥ್ರೋ ಮಾಡುತ್ತದೆ
} catch (e) {
console.log(e); // ಔಟ್ಪುಟ್: TypeError: ವಯಸ್ಸು ಪೂರ್ಣಾಂಕವಲ್ಲ
}
try {
proxy.age = -10; // RangeError ಅನ್ನು ಥ್ರೋ ಮಾಡುತ್ತದೆ
} catch (e) {
console.log(e); // ಔಟ್ಪುಟ್: RangeError: ವಯಸ್ಸು ಋಣಾತ್ಮಕವಲ್ಲದ ಪೂರ್ಣಾಂಕವಾಗಿರಬೇಕು
}
ಉದಾಹರಣೆ: ಬಳಕೆದಾರರ ಡೇಟಾಗೆ ವ್ಯಾಲಿಡೇಶನ್ ಅಗತ್ಯವಿರುವ ಇ-ಕಾಮರ್ಸ್ ಪ್ಲಾಟ್ಫಾರ್ಮ್ ಅನ್ನು ಪರಿಗಣಿಸಿ. ಪ್ರಾಕ್ಸಿಯು ವಯಸ್ಸು, ಇಮೇಲ್ ಫಾರ್ಮ್ಯಾಟ್, ಪಾಸ್ವರ್ಡ್ ಸ್ಟ್ರೆಂತ್, ಮತ್ತು ಇತರ ಫೀಲ್ಡ್ಗಳ ಮೇಲೆ ನಿಯಮಗಳನ್ನು ಜಾರಿಗೊಳಿಸಬಹುದು, ಅಮಾನ್ಯ ಡೇಟಾ ಸಂಗ್ರಹವಾಗುವುದನ್ನು ತಡೆಯುತ್ತದೆ.
2. ವರ್ಚುವಲೈಸೇಶನ್ (ಲೇಜಿ ಲೋಡಿಂಗ್)
ವರ್ಚುವಲೈಸೇಶನ್, ಇದನ್ನು ಲೇಜಿ ಲೋಡಿಂಗ್ ಎಂದೂ ಕರೆಯುತ್ತಾರೆ, ದುಬಾರಿ ಸಂಪನ್ಮೂಲಗಳನ್ನು ನಿಜವಾಗಿ ಅಗತ್ಯವಿರುವವರೆಗೆ ಲೋಡ್ ಮಾಡುವುದನ್ನು ವಿಳಂಬಗೊಳಿಸುತ್ತದೆ. ಪ್ರಾಕ್ಸಿಯು ನೈಜ ಆಬ್ಜೆಕ್ಟ್ಗೆ ಪ್ಲೇಸ್ಹೋಲ್ಡರ್ ಆಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸಬಹುದು, ಪ್ರಾಪರ್ಟಿಯನ್ನು ಆಕ್ಸೆಸ್ ಮಾಡಿದಾಗ ಮಾತ್ರ ಅದನ್ನು ಲೋಡ್ ಮಾಡುತ್ತದೆ.
const expensiveData = {
load: function() {
console.log('ದುಬಾರಿ ಡೇಟಾವನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ...');
// ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುವ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ಅನುಕರಿಸಿ (ಉದಾ., ಡೇಟಾಬೇಸ್ನಿಂದ ಪಡೆಯುವುದು)
return new Promise(resolve => {
setTimeout(() => {
resolve({
data: 'ಇದು ದುಬಾರಿ ಡೇಟಾ'
});
}, 2000);
});
}
};
const lazyLoadHandler = {
get: function(target, prop) {
if (prop === 'data') {
console.log('ಡೇಟಾವನ್ನು ಆಕ್ಸೆಸ್ ಮಾಡಲಾಗುತ್ತಿದೆ, ಅಗತ್ಯವಿದ್ದರೆ ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ...');
return target.load().then(result => {
target.data = result.data; // ಲೋಡ್ ಮಾಡಿದ ಡೇಟಾವನ್ನು ಸಂಗ್ರಹಿಸಿ
return result.data;
});
} else {
return target[prop];
}
}
};
const lazyData = new Proxy(expensiveData, lazyLoadHandler);
console.log('ಆರಂಭಿಕ ಆಕ್ಸೆಸ್...');
lazyData.data.then(data => {
console.log('ಡೇಟಾ:', data); // ಔಟ್ಪುಟ್: ಡೇಟಾ: ಇದು ದುಬಾರಿ ಡೇಟಾ
});
console.log('ನಂತರದ ಆಕ್ಸೆಸ್...');
lazyData.data.then(data => {
console.log('ಡೇಟಾ:', data); // ಔಟ್ಪುಟ್: ಡೇಟಾ: ಇದು ದುಬಾರಿ ಡೇಟಾ (ಕ್ಯಾಶ್ನಿಂದ ಲೋಡ್ ಆಗಿದೆ)
});
ಉದಾಹರಣೆ: ಹಲವಾರು ವಿವರಗಳು ಮತ್ತು ಸಂಬಂಧಿತ ಮಾಧ್ಯಮಗಳನ್ನು ಒಳಗೊಂಡಿರುವ ಬಳಕೆದಾರರ ಪ್ರೊಫೈಲ್ಗಳೊಂದಿಗೆ ದೊಡ್ಡ ಸಾಮಾಜಿಕ ಮಾಧ್ಯಮ ಪ್ಲಾಟ್ಫಾರ್ಮ್ ಅನ್ನು ಕಲ್ಪಿಸಿಕೊಳ್ಳಿ. ಎಲ್ಲಾ ಪ್ರೊಫೈಲ್ ಡೇಟಾವನ್ನು ತಕ್ಷಣವೇ ಲೋಡ್ ಮಾಡುವುದು ಅಸಮರ್ಥವಾಗಿರುತ್ತದೆ. ಪ್ರಾಕ್ಸಿಯೊಂದಿಗೆ ವರ್ಚುವಲೈಸೇಶನ್ ಮೊದಲು ಮೂಲಭೂತ ಪ್ರೊಫೈಲ್ ಮಾಹಿತಿಯನ್ನು ಲೋಡ್ ಮಾಡಲು ಅನುಮತಿಸುತ್ತದೆ, ಮತ್ತು ನಂತರ ಬಳಕೆದಾರರು ಆ ವಿಭಾಗಗಳಿಗೆ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿದಾಗ ಮಾತ್ರ ಹೆಚ್ಚುವರಿ ವಿವರಗಳು ಅಥವಾ ಮಾಧ್ಯಮ ವಿಷಯವನ್ನು ಲೋಡ್ ಮಾಡುತ್ತದೆ.
3. ಲಾಗಿಂಗ್ ಮತ್ತು ಟ್ರ್ಯಾಕಿಂಗ್
ಪ್ರಾಕ್ಸಿಗಳನ್ನು ಪ್ರಾಪರ್ಟಿ ಆಕ್ಸೆಸ್ ಮತ್ತು ಮಾರ್ಪಾಡುಗಳನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಲು ಬಳಸಬಹುದು. ಇದು ಡೀಬಗ್ಗಿಂಗ್, ಆಡಿಟಿಂಗ್, ಮತ್ತು ಕಾರ್ಯಕ್ಷಮತೆ ಮೇಲ್ವಿಚಾರಣೆಗೆ ಮೌಲ್ಯಯುತವಾಗಿದೆ.
const logHandler = {
get: function(target, prop, receiver) {
console.log(`GET ${prop}`);
return Reflect.get(target, prop, receiver);
},
set: function(target, prop, value) {
console.log(`SET ${prop} to ${value}`);
target[prop] = value;
return true;
}
};
let obj = { name: 'Alice' };
let proxy = new Proxy(obj, logHandler);
console.log(proxy.name); // ಔಟ್ಪುಟ್: GET name, Alice
proxy.age = 30; // ಔಟ್ಪುಟ್: SET age to 30
ಉದಾಹರಣೆ: ಸಹಯೋಗದೊಂದಿಗೆ ಡಾಕ್ಯುಮೆಂಟ್ ಎಡಿಟಿಂಗ್ ಅಪ್ಲಿಕೇಶನ್ನಲ್ಲಿ, ಪ್ರಾಕ್ಸಿಯು ಡಾಕ್ಯುಮೆಂಟ್ ವಿಷಯಕ್ಕೆ ಮಾಡಿದ ಪ್ರತಿಯೊಂದು ಬದಲಾವಣೆಯನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಬಹುದು. ಇದು ಆಡಿಟ್ ಟ್ರಯಲ್ ಅನ್ನು ರಚಿಸಲು, ಅಂಡೂ/ರಿಡೂ ಕಾರ್ಯವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು, ಮತ್ತು ಬಳಕೆದಾರರ ಕೊಡುಗೆಗಳ ಬಗ್ಗೆ ಒಳನೋಟಗಳನ್ನು ಒದಗಿಸಲು ಅನುಮತಿಸುತ್ತದೆ.
4. ರೀಡ್-ಓನ್ಲಿ ವೀಕ್ಷಣೆಗಳು
ಪ್ರಾಕ್ಸಿಗಳು ಆಬ್ಜೆಕ್ಟ್ಗಳ ರೀಡ್-ಓನ್ಲಿ ವೀಕ್ಷಣೆಗಳನ್ನು ರಚಿಸಬಹುದು, ಆಕಸ್ಮಿಕ ಮಾರ್ಪಾಡುಗಳನ್ನು ತಡೆಯುತ್ತದೆ. ಸೂಕ್ಷ್ಮ ಡೇಟಾವನ್ನು ರಕ್ಷಿಸಲು ಇದು ಉಪಯುಕ್ತವಾಗಿದೆ.
const readOnlyHandler = {
set: function(target, prop, value) {
console.error(`ಪ್ರಾಪರ್ಟಿ ${prop} ಅನ್ನು ಸೆಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ: ಆಬ್ಜೆಕ್ಟ್ ರೀಡ್-ಓನ್ಲಿ ಆಗಿದೆ`);
return false; // ಸೆಟ್ ಕಾರ್ಯಾಚರಣೆ ವಿಫಲವಾಗಿದೆ ಎಂದು ಸೂಚಿಸಿ
},
deleteProperty: function(target, prop) {
console.error(`ಪ್ರಾಪರ್ಟಿ ${prop} ಅನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ: ಆಬ್ಜೆಕ್ಟ್ ರೀಡ್-ಓನ್ಲಿ ಆಗಿದೆ`);
return false; // ಡಿಲೀಟ್ ಕಾರ್ಯಾಚರಣೆ ವಿಫಲವಾಗಿದೆ ಎಂದು ಸೂಚಿಸಿ
}
};
let data = { name: 'Bob', age: 40 };
let readOnlyData = new Proxy(data, readOnlyHandler);
try {
readOnlyData.age = 41; // ದೋಷವನ್ನು ಥ್ರೋ ಮಾಡುತ್ತದೆ
} catch (e) {
console.log(e); // ಯಾವುದೇ ದೋಷ ಥ್ರೋ ಆಗುವುದಿಲ್ಲ ಏಕೆಂದರೆ 'set' ಟ್ರ್ಯಾಪ್ false ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ.
}
try {
delete readOnlyData.name; // ದೋಷವನ್ನು ಥ್ರೋ ಮಾಡುತ್ತದೆ
} catch (e) {
console.log(e); // ಯಾವುದೇ ದೋಷ ಥ್ರೋ ಆಗುವುದಿಲ್ಲ ಏಕೆಂದರೆ 'deleteProperty' ಟ್ರ್ಯಾಪ್ false ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ.
}
console.log(data.age); // ಔಟ್ಪುಟ್: 40 (ಬದಲಾಗಿಲ್ಲ)
ಉದಾಹರಣೆ: ಕೆಲವು ಬಳಕೆದಾರರಿಗೆ ಖಾತೆ ಮಾಹಿತಿಗೆ ರೀಡ್-ಓನ್ಲಿ ಪ್ರವೇಶವಿರುವ ಹಣಕಾಸು ವ್ಯವಸ್ಥೆಯನ್ನು ಪರಿಗಣಿಸಿ. ಈ ಬಳಕೆದಾರರು ಖಾತೆ ಬ್ಯಾಲೆನ್ಸ್ ಅಥವಾ ಇತರ ನಿರ್ಣಾಯಕ ಡೇಟಾವನ್ನು ಮಾರ್ಪಡಿಸುವುದನ್ನು ತಡೆಯಲು ಪ್ರಾಕ್ಸಿಯನ್ನು ಬಳಸಬಹುದು.
5. ಡೀಫಾಲ್ಟ್ ಮೌಲ್ಯಗಳು
ಪ್ರಾಕ್ಸಿಯು ಕಾಣೆಯಾದ ಪ್ರಾಪರ್ಟಿಗಳಿಗೆ ಡೀಫಾಲ್ಟ್ ಮೌಲ್ಯಗಳನ್ನು ಒದಗಿಸಬಹುದು. ಇದು ಕೋಡ್ ಅನ್ನು ಸರಳಗೊಳಿಸುತ್ತದೆ ಮತ್ತು null/undefined ಚೆಕ್ಗಳನ್ನು ತಪ್ಪಿಸುತ್ತದೆ.
const defaultValuesHandler = {
get: function(target, prop, receiver) {
if (!(prop in target)) {
console.log(`ಪ್ರಾಪರ್ಟಿ ${prop} ಕಂಡುಬಂದಿಲ್ಲ, ಡೀಫಾಲ್ಟ್ ಮೌಲ್ಯವನ್ನು ಹಿಂತಿರುಗಿಸಲಾಗುತ್ತಿದೆ.`);
return 'ಡೀಫಾಲ್ಟ್ ಮೌಲ್ಯ'; // ಅಥವಾ ಯಾವುದೇ ಇತರ ಸೂಕ್ತ ಡೀಫಾಲ್ಟ್
}
return Reflect.get(target, prop, receiver);
}
};
let config = { apiUrl: 'https://api.example.com' };
let configWithDefaults = new Proxy(config, defaultValuesHandler);
console.log(configWithDefaults.apiUrl); // ಔಟ್ಪುಟ್: https://api.example.com
console.log(configWithDefaults.timeout); // ಔಟ್ಪುಟ್: ಪ್ರಾಪರ್ಟಿ timeout ಕಂಡುಬಂದಿಲ್ಲ, ಡೀಫಾಲ್ಟ್ ಮೌಲ್ಯವನ್ನು ಹಿಂತಿರುಗಿಸಲಾಗುತ್ತಿದೆ. ಡೀಫಾಲ್ಟ್ ಮೌಲ್ಯ
ಉದಾಹರಣೆ: ಕಾನ್ಫಿಗರೇಶನ್ ಮ್ಯಾನೇಜ್ಮೆಂಟ್ ಸಿಸ್ಟಮ್ನಲ್ಲಿ, ಪ್ರಾಕ್ಸಿಯು ಕಾಣೆಯಾದ ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಡೀಫಾಲ್ಟ್ ಮೌಲ್ಯಗಳನ್ನು ಒದಗಿಸಬಹುದು. ಉದಾಹರಣೆಗೆ, ಕಾನ್ಫಿಗರೇಶನ್ ಫೈಲ್ ಡೇಟಾಬೇಸ್ ಸಂಪರ್ಕದ ಟೈಮ್ಔಟ್ ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸದಿದ್ದರೆ, ಪ್ರಾಕ್ಸಿಯು ಪೂರ್ವನಿರ್ಧರಿತ ಡೀಫಾಲ್ಟ್ ಮೌಲ್ಯವನ್ನು ಹಿಂತಿರುಗಿಸಬಹುದು.
6. ಮೆಟಾಡೇಟಾ ಮತ್ತು ಅನೋಟೇಶನ್ಗಳು
ಪ್ರಾಕ್ಸಿಗಳು ಆಬ್ಜೆಕ್ಟ್ಗಳಿಗೆ ಮೆಟಾಡೇಟಾ ಅಥವಾ ಅನೋಟೇಶನ್ಗಳನ್ನು ಲಗತ್ತಿಸಬಹುದು, ಮೂಲ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಮಾರ್ಪಡಿಸದೆ ಹೆಚ್ಚುವರಿ ಮಾಹಿತಿಯನ್ನು ಒದಗಿಸುತ್ತದೆ.
const metadataHandler = {
get: function(target, prop, receiver) {
if (prop === '__metadata__') {
return { description: 'ಇದು ಆಬ್ಜೆಕ್ಟ್ಗಾಗಿ ಮೆಟಾಡೇಟಾ' };
}
return Reflect.get(target, prop, receiver);
}
};
let article = { title: 'ಪ್ರಾಕ್ಸಿಗಳ ಪರಿಚಯ', content: '...' };
let articleWithMetadata = new Proxy(article, metadataHandler);
console.log(articleWithMetadata.title); // ಔಟ್ಪುಟ್: ಪ್ರಾಕ್ಸಿಗಳ ಪರಿಚಯ
console.log(articleWithMetadata.__metadata__.description); // ಔಟ್ಪುಟ್: ಇದು ಆಬ್ಜೆಕ್ಟ್ಗಾಗಿ ಮೆಟಾಡೇಟಾ
ಉದಾಹರಣೆ: ಕಂಟೆಂಟ್ ಮ್ಯಾನೇಜ್ಮೆಂಟ್ ಸಿಸ್ಟಮ್ನಲ್ಲಿ, ಪ್ರಾಕ್ಸಿಯು ಲೇಖನಗಳಿಗೆ ಲೇಖಕರ ಮಾಹಿತಿ, ಪ್ರಕಟಣೆ ದಿನಾಂಕ, ಮತ್ತು ಕೀವರ್ಡ್ಗಳಂತಹ ಮೆಟಾಡೇಟಾವನ್ನು ಲಗತ್ತಿಸಬಹುದು. ಈ ಮೆಟಾಡೇಟಾವನ್ನು ವಿಷಯವನ್ನು ಹುಡುಕಲು, ಫಿಲ್ಟರ್ ಮಾಡಲು, ಮತ್ತು ವರ್ಗೀಕರಿಸಲು ಬಳಸಬಹುದು.
7. ಫಂಕ್ಷನ್ ಇಂಟರ್ಸೆಪ್ಶನ್
ಪ್ರಾಕ್ಸಿಗಳು ಫಂಕ್ಷನ್ ಕಾಲ್ಗಳನ್ನು ತಡೆಹಿಡಿಯಬಹುದು, ಲಾಗಿಂಗ್, ವ್ಯಾಲಿಡೇಶನ್, ಅಥವಾ ಇತರ ಪೂರ್ವ ಅಥವಾ ನಂತರದ ಪ್ರಕ್ರಿಯೆಯ ಲಾಜಿಕ್ ಅನ್ನು ಸೇರಿಸಲು ನಿಮಗೆ ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ.
const functionInterceptor = {
apply: function(target, thisArg, argumentsList) {
console.log('ವಾದಗಳೊಂದಿಗೆ ಫಂಕ್ಷನ್ ಅನ್ನು ಕರೆಯಲಾಗುತ್ತಿದೆ:', argumentsList);
const result = target.apply(thisArg, argumentsList);
console.log('ಫಂಕ್ಷನ್ ಹಿಂತಿರುಗಿಸಿದೆ:', result);
return result;
}
};
function add(a, b) {
return a + b;
}
let proxiedAdd = new Proxy(add, functionInterceptor);
let sum = proxiedAdd(5, 3); // ಔಟ್ಪುಟ್: ವಾದಗಳೊಂದಿಗೆ ಫಂಕ್ಷನ್ ಅನ್ನು ಕರೆಯಲಾಗುತ್ತಿದೆ: [5, 3], ಫಂಕ್ಷನ್ ಹಿಂತಿರುಗಿಸಿದೆ: 8
console.log(sum); // ಔಟ್ಪುಟ್: 8
ಉದಾಹರಣೆ: ಬ್ಯಾಂಕಿಂಗ್ ಅಪ್ಲಿಕೇಶನ್ನಲ್ಲಿ, ಪ್ರಾಕ್ಸಿಯು ವಹಿವಾಟು ಫಂಕ್ಷನ್ಗಳಿಗೆ ಮಾಡುವ ಕಾಲ್ಗಳನ್ನು ತಡೆಹಿಡಿಯಬಹುದು, ಪ್ರತಿ ವಹಿವಾಟನ್ನು ಲಾಗ್ ಮಾಡಬಹುದು ಮತ್ತು ವಹಿವಾಟನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವ ಮೊದಲು ವಂಚನೆ ಪತ್ತೆ ತಪಾಸಣೆಗಳನ್ನು ಮಾಡಬಹುದು.
8. ಕನ್ಸ್ಟ್ರಕ್ಟರ್ ಇಂಟರ್ಸೆಪ್ಶನ್
ಪ್ರಾಕ್ಸಿಗಳು ಕನ್ಸ್ಟ್ರಕ್ಟರ್ ಕಾಲ್ಗಳನ್ನು ತಡೆಹಿಡಿಯಬಹುದು, ಆಬ್ಜೆಕ್ಟ್ ರಚನೆಯನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಲು ನಿಮಗೆ ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ.
const constructorInterceptor = {
construct: function(target, argumentsList, newTarget) {
console.log(target.name, 'ನ ಹೊಸ ನಿದರ್ಶನವನ್ನು ವಾದಗಳೊಂದಿಗೆ ರಚಿಸಲಾಗುತ್ತಿದೆ:', argumentsList);
const obj = new target(...argumentsList);
console.log('ಹೊಸ ನಿದರ್ಶನವನ್ನು ರಚಿಸಲಾಗಿದೆ:', obj);
return obj;
}
};
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
}
let ProxiedPerson = new Proxy(Person, constructorInterceptor);
let person = new ProxiedPerson('Alice', 28); // ಔಟ್ಪುಟ್: Person ನ ಹೊಸ ನಿದರ್ಶನವನ್ನು ವಾದಗಳೊಂದಿಗೆ ರಚಿಸಲಾಗುತ್ತಿದೆ: ['Alice', 28], ಹೊಸ ನಿದರ್ಶನವನ್ನು ರಚಿಸಲಾಗಿದೆ: Person { name: 'Alice', age: 28 }
console.log(person);
ಉದಾಹರಣೆ: ಗೇಮ್ ಡೆವಲಪ್ಮೆಂಟ್ ಫ್ರೇಮ್ವರ್ಕ್ನಲ್ಲಿ, ಪ್ರಾಕ್ಸಿಯು ಗೇಮ್ ಆಬ್ಜೆಕ್ಟ್ಗಳ ರಚನೆಯನ್ನು ತಡೆಹಿಡಿಯಬಹುದು, ಸ್ವಯಂಚಾಲಿತವಾಗಿ ವಿಶಿಷ್ಟ ID ಗಳನ್ನು ನಿಯೋಜಿಸಬಹುದು, ಡೀಫಾಲ್ಟ್ ಘಟಕಗಳನ್ನು ಸೇರಿಸಬಹುದು, ಮತ್ತು ಅವುಗಳನ್ನು ಗೇಮ್ ಇಂಜಿನ್ನೊಂದಿಗೆ ನೋಂದಾಯಿಸಬಹುದು.
ಸುಧಾರಿತ ಪರಿಗಣನೆಗಳು
- ಕಾರ್ಯಕ್ಷಮತೆ: ಪ್ರಾಕ್ಸಿಗಳು ನಮ್ಯತೆಯನ್ನು ನೀಡಿದರೂ, ಅವು ಕಾರ್ಯಕ್ಷಮತೆಯ ಮೇಲೆ ಹೊರೆ ಉಂಟುಮಾಡಬಹುದು. ನಿಮ್ಮ ಕೋಡ್ ಅನ್ನು ಬೆಂಚ್ಮಾರ್ಕ್ ಮತ್ತು ಪ್ರೊಫೈಲ್ ಮಾಡುವುದು ಮುಖ್ಯವಾಗಿದೆ, ವಿಶೇಷವಾಗಿ ಕಾರ್ಯಕ್ಷಮತೆ-ನಿರ್ಣಾಯಕ ಅಪ್ಲಿಕೇಶನ್ಗಳಲ್ಲಿ, ಪ್ರಾಕ್ಸಿಗಳನ್ನು ಬಳಸುವ ಪ್ರಯೋಜನಗಳು ಕಾರ್ಯಕ್ಷಮತೆಯ ವೆಚ್ಚಗಳನ್ನು ಮೀರಿಸುತ್ತವೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು.
- ಹೊಂದಾಣಿಕೆ: ಪ್ರಾಕ್ಸಿಗಳು ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ಗೆ ತುಲನಾತ್ಮಕವಾಗಿ ಇತ್ತೀಚಿನ ಸೇರ್ಪಡೆಯಾಗಿದೆ, ಆದ್ದರಿಂದ ಹಳೆಯ ಬ್ರೌಸರ್ಗಳು ಅವುಗಳನ್ನು ಬೆಂಬಲಿಸದೇ ಇರಬಹುದು. ಹಳೆಯ ಪರಿಸರಗಳೊಂದಿಗೆ ಹೊಂದಾಣಿಕೆಯನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಫೀಚರ್ ಡಿಟೆಕ್ಷನ್ ಅಥವಾ ಪಾಲಿಫಿಲ್ಗಳನ್ನು ಬಳಸಿ.
- ಹಿಂತೆಗೆದುಕೊಳ್ಳಬಹುದಾದ ಪ್ರಾಕ್ಸಿಗಳು:
Proxy.revocable()
ಮೆಥಡ್ ಹಿಂತೆಗೆದುಕೊಳ್ಳಬಹುದಾದ ಪ್ರಾಕ್ಸಿಯನ್ನು ರಚಿಸುತ್ತದೆ. ಪ್ರಾಕ್ಸಿಯನ್ನು ಹಿಂತೆಗೆದುಕೊಳ್ಳುವುದು ಯಾವುದೇ ಮುಂದಿನ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ತಡೆಹಿಡಿಯುವುದನ್ನು ತಡೆಯುತ್ತದೆ. ಇದು ಭದ್ರತೆ ಅಥವಾ ಸಂಪನ್ಮೂಲ ನಿರ್ವಹಣೆಯ ಉದ್ದೇಶಗಳಿಗಾಗಿ ಉಪಯುಕ್ತವಾಗಬಹುದು. - Reflect API: Reflect API ಯು ಪ್ರಾಕ್ಸಿ ಟ್ರ್ಯಾಪ್ಗಳ ಡೀಫಾಲ್ಟ್ ನಡವಳಿಕೆಯನ್ನು ನಿರ್ವಹಿಸಲು ಮೆಥಡ್ಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ.
Reflect
ಅನ್ನು ಬಳಸುವುದು ನಿಮ್ಮ ಪ್ರಾಕ್ಸಿ ಕೋಡ್ ಭಾಷೆಯ ನಿರ್ದಿಷ್ಟತೆಯೊಂದಿಗೆ ಸ್ಥಿರವಾಗಿ ವರ್ತಿಸುತ್ತದೆ ಎಂದು ಖಚಿತಪಡಿಸುತ್ತದೆ.
ತೀರ್ಮಾನ
ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಪ್ರಾಕ್ಸಿಗಳು ಆಬ್ಜೆಕ್ಟ್ ನಡವಳಿಕೆಯನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಲು ಒಂದು ಶಕ್ತಿಯುತ ಮತ್ತು ಬಹುಮುಖಿ ವ್ಯವಸ್ಥೆಯನ್ನು ಒದಗಿಸುತ್ತವೆ. ವಿವಿಧ ಪ್ರಾಕ್ಸಿ ಪ್ಯಾಟರ್ನ್ಗಳನ್ನು ಕರಗತ ಮಾಡಿಕೊಳ್ಳುವ ಮೂಲಕ, ನೀವು ಹೆಚ್ಚು ದೃಢವಾದ, ನಿರ್ವಹಿಸಬಲ್ಲ, ಮತ್ತು ದಕ್ಷ ಕೋಡ್ ಅನ್ನು ಬರೆಯಬಹುದು. ನೀವು ವ್ಯಾಲಿಡೇಶನ್, ವರ್ಚುವಲೈಸೇಶನ್, ಟ್ರ್ಯಾಕಿಂಗ್, ಅಥವಾ ಇತರ ಸುಧಾರಿತ ತಂತ್ರಗಳನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುತ್ತಿರಲಿ, ಪ್ರಾಕ್ಸಿಗಳು ಆಬ್ಜೆಕ್ಟ್ಗಳನ್ನು ಹೇಗೆ ಪ್ರವೇಶಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಕುಶಲತೆಯಿಂದ ನಿರ್ವಹಿಸಲಾಗುತ್ತದೆ ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಲು ಒಂದು ನಮ್ಯವಾದ ಪರಿಹಾರವನ್ನು ನೀಡುತ್ತವೆ. ಯಾವಾಗಲೂ ಕಾರ್ಯಕ್ಷಮತೆಯ ಪರಿಣಾಮಗಳನ್ನು ಪರಿಗಣಿಸಿ ಮತ್ತು ನಿಮ್ಮ ಗುರಿ ಪರಿಸರಗಳೊಂದಿಗೆ ಹೊಂದಾಣಿಕೆಯನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ. ಪ್ರಾಕ್ಸಿಗಳು ಆಧುನಿಕ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಡೆವಲಪರ್ನ ಶಸ್ತ್ರಾಗಾರದಲ್ಲಿ ಒಂದು ಪ್ರಮುಖ ಸಾಧನವಾಗಿದ್ದು, ಶಕ್ತಿಯುತ ಮೆಟಾಪ್ರೋಗ್ರಾಮಿಂಗ್ ತಂತ್ರಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತವೆ.
ಹೆಚ್ಚಿನ ಅನ್ವೇಷಣೆ
- ಮೋಝಿಲ್ಲಾ ಡೆವಲಪರ್ ನೆಟ್ವರ್ಕ್ (MDN): ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಪ್ರಾಕ್ಸಿ
- ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಪ್ರಾಕ್ಸಿಗಳನ್ನು ಅನ್ವೇಷಿಸುವುದು: ಸ್ಮ್ಯಾಶಿಂಗ್ ಮ್ಯಾಗಜೀನ್ ಲೇಖನ